C++ Standard Library |
---|
Standard Template Library |
|
C standard library |
|
A function object, or functor, in C++ is simply any object that can be called as if it is a function. A function object could be an ordinary function or a function pointer. More generally, it could be an object of a class that defines a function call operator.
No STL algorithms require function objects of more than two arguments. Function objects that return Boolean values are an important special case. A unary function whose return type is bool is called a predicate, and a binary function whose return type is bool is called a binary predicate.
In general, a function object has restrictions on the type of its argument. The type restrictions need not be simple, though: operator() may be overloaded or may be a member template. Similarly, there need be no way for a program to determine what those restrictions are. An adaptable function object, however, does specify what the argument and return types are, and provides nested typedefs so that those types can be named and used in programs. If a type F0 is a model of an adaptable generator, then it must define F0::result_type. Similarly, if F1 is a model of the adaptable unary function, it must define F1::argument_type and F1::result_type, and if F2 is a model of the adaptable binary function, it must define F2::first_argument_type, F2::second_argument_type, and F2::result_type. The STL provides base classes unary_function and binary_function to simplify the definition of adaptable unary functions and adaptable binary functions.
Adaptable function objects are important, because they can be used by function object adaptors: function objects that transform or manipulate other function objects. The STL provides many different function object adaptors, including unary_negate (that returns the logical complement of the value returned by a particular adaptable predicate), and unary_compose and binary_compose, which perform composition of function object.
The STL includes many different predefined function objects, including arithmetic operations ( plus, minus, multiplies, divides, modulus, and negate), comparisons ( equal_to, not_equal_to, greater, less, greater_equal, and less_equal), and logical operations ( logical_and, logical_or, and logical_not). It is possible to perform very sophisticated operations without actually writing a new function object, simply by combining predefined function objects and function object adaptors.